/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package docmanager.engine;

import bf.*;
import java.sql.*;
import java.util.Iterator;
import java.util.List;

import docmanager.business.objects.*;
import docmanager.db.ConnectionPool;

/**
 *
 * @author Juan Lucas
 */
public class DMSecurityHandler extends bf.SecurityHandler
{
    
    public DMSecurityHandler()
    {
    }
 
    
    // Por ahora el security permite cualquier posibilidad.
    @Override
    public int validate(String operacion, String usuario)
            throws bf.exceptions.SecurityException
    {
       
    	boolean acceso = false;
    	try {
			Connection conn = ConnectionPool.getConnection();
			Usuario u = new Usuario(conn, usuario);
			List roles = u.cargarRoles();
			// Veamos si alguno de sus roles tiene acceso completo
			// o bien incluye a la operacion.
			Iterator it = roles.iterator();
			while (it.hasNext())
			{
				Rol rol = (Rol) it.next();
				if (rol.isCompleteControl())
				{
					acceso = true;
					break;
				}
				rol.cargarOperaciones();
				List nombresOp = OperacionDB.obtenerNombres(rol.getOperaciones());
				if (nombresOp.contains(operacion))
				{
					acceso = true;
					break;
				}
			}
			// En el otro caso debemos chequear las operaciones permitidas por cada rol.
			ConnectionPool.closeConn(conn);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new bf.exceptions.SecurityException();
		}
    	
    	
    	if (acceso)
    		return SecurityHandler.CORRECTO;
    	else 
    		return SecurityHandler.OPERACION_NOPERMITIDA;
    }

    @Override
    public int validarLogin(String usuario, String clave)
            throws SecurityException
    {
        try
        {
            System.out.println("DMSecurityHandler: validando "+usuario+" " + clave);
            // Primero, veamos si existe el usario.
            Connection conn = ConnectionPool.getConnection();
System.out.println("DMSH: conn vale " + conn);
            boolean existeUsuario = Usuario.existeUsuario(conn, usuario);
            int retorno;
            if(!existeUsuario)
            {
                retorno = SecurityHandler.USUARIO_INEXISTENTE;
                ConnectionPool.closeConn(conn);
                return retorno;
            }
            // Segundo, veamos si la clave es "universal".
            // En ese caso, se acepta cualquier cosa.
            else if (clave == "universal")
            {
                retorno = SecurityHandler.CORRECTO;
            }
            // Levantamos el usuario de la base.
            Usuario user = new Usuario(conn,usuario);
            if (clave.equals(user.getClave()))
            {
                ConnectionPool.closeConn(conn);
                return SecurityHandler.CORRECTO;
            }
            ConnectionPool.closeConn(conn);
            return SecurityHandler.CLAVE_INEXISTENTE;
        } catch (SQLException sQLException)
        {
            SecurityException exc = new SecurityException(sQLException);
            throw exc;
        }
        
    }
    
}
